home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swagg_m.zip / KEYBOARD.SWG / 0089_Stuffing keyboard buffer.pas < prev    next >
Pascal/Delphi Source File  |  1995-03-03  |  8KB  |  301 lines

  1. {
  2.  BD> I have a loop that goes something like this:
  3.  
  4.  BD>         uses crt;
  5.  BD>         var c: char;
  6.  BD>             i: integer;
  7.  <skipped>
  8.  
  9.  BD>   The problem is, if they press anything, the program needs to simulate
  10.  BD> F10 being pressed.  Obviously, if the user hits F10, the loop ends just
  11.  BD> like anything else.  And, if I don't put the c := readkey at the end, I
  12.  BD> get an extra keystroke.
  13.  
  14.  BD> So...
  15.  
  16.  BD> can anyone tell me how to put F10 in the keyboard buffer?
  17.  
  18. Sure, no problem. Here is the routine:
  19. }
  20.  
  21. Procedure StuffKey(Key : word); assembler;
  22. {$IFNDEF BP70} const Seg0040 = $0040; {$ENDIF}
  23. Asm
  24.   cli
  25.   mov es,Seg0040
  26.   mov di,001Ch
  27.   mov ax,Key
  28.   xchg ah,al
  29.   mov bx,[es:di]
  30.   mov [es:bx],ax
  31.   add byte ptr [es:di],2
  32.   cmp byte ptr [es:di],60
  33.   jle @@1
  34.   mov byte ptr [es:di],30
  35. @@1:
  36.   sti
  37. End; { StuffKey }
  38.  
  39. { and here are the values to pass to StuffKey: }
  40.  
  41. const
  42.  
  43.   { standard (non-extended) key codes }
  44.  
  45.   keyNull          = $0000;
  46.   keyBell          = $0700;
  47.   keyEscape        = $1B00;
  48.   keyTab           = $0900;
  49.   keyBackspace     = $0800;
  50.   keySpace         = $2000;
  51.   keyEnter         = $0D00;
  52.   keyCtrlEnter     = $0A00;
  53.   keyCtrlY         = $1900;
  54.   keyA             = $4100;
  55.   keyZ             = $5A00;
  56.  
  57.   { extended key codes }
  58.  
  59.   keyUp            = $0048;
  60.   keyDown          = $0050;
  61.   keyLeft          = $004B;
  62.   keyRight         = $004D;
  63.   keyCtrlLeft      = $0073;
  64.   keyCtrlRight     = $0074;
  65.   keyPageUp        = $0049;
  66.   keyPageDown      = $0051;
  67.   keyHome          = $0047;
  68.   keyEnd           = $004F;
  69.   keyDelete        = $0053;
  70.   keyInsert        = $0052;
  71.   keyF1            = $003B;
  72.   keyF2            = $003C;
  73.   keyF3            = $003D;
  74.   keyF4            = $003E;
  75.   keyF5            = $003F;
  76.   keyF6            = $0040;
  77.   keyF7            = $0041;
  78.   keyF8            = $0042;
  79.   keyF9            = $0043;
  80.   keyF10           = $0044;
  81.   keyShiftF1       = $0054;
  82.   keyShiftF2       = $0055;
  83.   keyShiftF3       = $0056;
  84.   keyShiftF4       = $0057;
  85.   keyShiftF5       = $0058;
  86.   keyShiftF6       = $0059;
  87.   keyShiftF7       = $005A;
  88.   keyShiftF8       = $005B;
  89.   keyShiftF9       = $005C;
  90.   keyShiftF10      = $005D;
  91.   keyCtrlF1        = $005E;
  92.   keyCtrlF2        = $005F;
  93.   keyCtrlF3        = $0060;
  94.   keyCtrlF4        = $0061;
  95.   keyCtrlF5        = $0062;
  96.   keyCtrlF6        = $0063;
  97.   keyCtrlF7        = $0064;
  98.   keyCtrlF8        = $0065;
  99.   keyCtrlF9        = $0066;
  100.   keyCtrlF10       = $0067;
  101.   keyAltF1         = $0068;
  102.   keyAltF2         = $0069;
  103.   keyAltF3         = $006A;
  104.   keyAltF4         = $006B;
  105.   keyAltF5         = $006C;
  106.   keyAltF6         = $006D;
  107.   keyAltF7         = $006E;
  108.   keyAltF8         = $006F;
  109.   keyAltF9         = $0070;
  110.   keyAltF10        = $0071;
  111.   keyAltA          = $001E;
  112.   keyAltB          = $0030;
  113.   keyAltC          = $002E;
  114.   keyAltD          = $0020;
  115.   keyAltE          = $0012;
  116.   keyAltF          = $0021;
  117.   keyAltG          = $0022;
  118.   keyAltH          = $0023;
  119.   keyAltI          = $0017;
  120.   keyAltJ          = $0024;
  121.   keyAltK          = $0025;
  122.   keyAltL          = $0026;
  123.   keyAltM          = $0032;
  124.   keyAltN          = $0031;
  125.   keyAltO          = $0018;
  126.   keyAltP          = $0019;
  127.   keyAltQ          = $0010;
  128.   keyAltR          = $0013;
  129.   keyAltS          = $001F;
  130.   keyAltT          = $0014;
  131.   keyAltU          = $0016;
  132.   keyAltV          = $002F;
  133.   keyAltW          = $0011;
  134.   keyAltX          = $002D;
  135.   keyAltY          = $0015;
  136.   keyAltZ          = $002C;
  137.  
  138.  
  139. Example:
  140.  
  141. StuffKey(keyF10);  { will fortunately do the job for ya }
  142.  
  143. {
  144.  BP> Could someone please give me some source code to stuff a key into the
  145.  BP> keyboard buffer? :)
  146.  
  147. Here is for you and for SWAG:
  148.  
  149. { The following are ASCII and extended key codes that consist of:
  150.  
  151.   ASCII code:
  152.    hi byte: ASCII key code
  153.    lo byte: zero
  154.  
  155.   Extended code:
  156.    hi byte: zero
  157.    lo byte: Extended key code
  158. }
  159.  
  160. const
  161.   { ASCII key codes }
  162.  
  163.   { standard (non-extended) key codes }
  164.  
  165.   keyNull          = $0000;
  166.   keyBell          = $0700;
  167.   keyEscape        = $1B00;
  168.   keyTab           = $0900;
  169.   keyBackspace     = $0800;
  170.   keySpace         = $2000;
  171.   keyEnter         = $0D00;
  172.   keyCtrlEnter     = $0A00;
  173.   keyCtrlY         = $1900;
  174.   keyA             = $4100;
  175.   keyZ             = $5A00;
  176.  
  177.   { extended key codes }
  178.  
  179.   keyUp            = $0048;
  180.   keyDown          = $0050;
  181.   keyLeft          = $004B;
  182.   keyRight         = $004D;
  183.   keyCtrlLeft      = $0073;
  184.   keyCtrlRight     = $0074;
  185.   keyPageUp        = $0049;
  186.   keyPageDown      = $0051;
  187.   keyHome          = $0047;
  188.   keyEnd           = $004F;
  189.   keyDelete        = $0053;
  190.   keyInsert        = $0052;
  191.   keyF1            = $003B;
  192.   keyF2            = $003C;
  193.   keyF3            = $003D;
  194.   keyF4            = $003E;
  195.   keyF5            = $003F;
  196.   keyF6            = $0040;
  197.   keyF7            = $0041;
  198.   keyF8            = $0042;
  199.   keyF9            = $0043;
  200.   keyF10           = $0044;
  201.   keyShiftF1       = $0054;
  202.   keyShiftF2       = $0055;
  203.   keyShiftF3       = $0056;
  204.   keyShiftF4       = $0057;
  205.   keyShiftF5       = $0058;
  206.   keyShiftF6       = $0059;
  207.   keyShiftF7       = $005A;
  208.   keyShiftF8       = $005B;
  209.   keyShiftF9       = $005C;
  210.   keyShiftF10      = $005D;
  211.   keyCtrlF1        = $005E;
  212.   keyCtrlF2        = $005F;
  213.   keyCtrlF3        = $0060;
  214.   keyCtrlF4        = $0061;
  215.   keyCtrlF5        = $0062;
  216.   keyCtrlF6        = $0063;
  217.   keyCtrlF7        = $0064;
  218.   keyCtrlF8        = $0065;
  219.   keyCtrlF9        = $0066;
  220.   keyCtrlF10       = $0067;
  221.   keyAltF1         = $0068;
  222.   keyAltF2         = $0069;
  223.   keyAltF3         = $006A;
  224.   keyAltF4         = $006B;
  225.   keyAltF5         = $006C;
  226.   keyAltF6         = $006D;
  227.   keyAltF7         = $006E;
  228.   keyAltF8         = $006F;
  229.   keyAltF9         = $0070;
  230.   keyAltF10        = $0071;
  231.   keyAltA          = $001E;
  232.   keyAltB          = $0030;
  233.   keyAltC          = $002E;
  234.   keyAltD          = $0020;
  235.   keyAltE          = $0012;
  236.   keyAltF          = $0021;
  237.   keyAltG          = $0022;
  238.   keyAltH          = $0023;
  239.   keyAltI          = $0017;
  240.   keyAltJ          = $0024;
  241.   keyAltK          = $0025;
  242.   keyAltL          = $0026;
  243.   keyAltM          = $0032;
  244.   keyAltN          = $0031;
  245.   keyAltO          = $0018;
  246.   keyAltP          = $0019;
  247.   keyAltQ          = $0010;
  248.   keyAltR          = $0013;
  249.   keyAltS          = $001F;
  250.   keyAltT          = $0014;
  251.   keyAltU          = $0016;
  252.   keyAltV          = $002F;
  253.   keyAltW          = $0011;
  254.   keyAltX          = $002D;
  255.   keyAltY          = $0015;
  256.   keyAltZ          = $002C;
  257.  
  258. Procedure StuffKey(Key : word); assembler;
  259. Asm
  260.   cli
  261.   mov es,Seg0040
  262.   mov di,001Ch
  263.   mov ax,Key
  264.   xchg ah,al
  265.   mov bx,es:[di]
  266.   mov es:[bx],ax
  267.   add byte ptr es:[di],2
  268.   cmp byte ptr es:[di],60
  269.   jle @@1
  270.   mov byte ptr [es:di],30
  271. @@1:
  272.   sti
  273. End; { StuffKey }
  274.  
  275. The above function is BIOS-independant and thus should work on most of the
  276. PC compatibles.
  277.  
  278. Example:
  279.  
  280. var S : string;
  281.  
  282. Function MakeWord(Hi, Lo : byte) : word; assembler;
  283. Asm
  284.   mov ah,Hi
  285.   mov al,Lo
  286. End; { MakeWord }
  287.  
  288. Begin
  289.   Write('Enter a string: ');
  290.   StuffKey(MakeWord(Ord('H'), 0));
  291.   StuffKey(MakeWord(Ord('e'), 0));
  292.   StuffKey(MakeWord(Ord('l'), 0));
  293.   StuffKey(MakeWord(Ord('l'), 0));
  294.   StuffKey(MakeWord(Ord('o'), 0));
  295.   StuffKey(MakeWord(Ord('!'), 0));
  296.   StuffKey(keyEnter);
  297.   ReadLn(S);
  298.   WriteLn('Oh, you have already typed your string? :O Hmm, smart guy...')
  299. End.
  300.  
  301.